package com.atguigu.tingshu.album.service.impl;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;

import com.atguigu.tingshu.common.execption.GuiguException;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.atguigu.tingshu.vo.album.AlbumStatVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.google.common.collect.Maps;

import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

	@Autowired
	private AlbumInfoMapper albumInfoMapper;

	@Autowired
	AlbumAttributeValueMapper albumAttributeValueMapper;

	@Autowired
	AlbumStatMapper albumStatMapper;

	@Transactional
	@Override
	public void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId) {
		AlbumInfo albumInfo = new AlbumInfo();
		BeanUtils.copyProperties(albumInfoVo,albumInfo);
		albumInfo.setUserId(userId);
		albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS); //默认通过
		if (!albumInfo.getPayType().equals(SystemConstant.ALBUM_PAY_TYPE_FREE)){
			albumInfo.setTracksForFree(5);
		}
		albumInfoMapper.insert(albumInfo);

		//保存标签
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		for (AlbumAttributeValueVo albumAttributeValueVo : albumAttributeValueVoList) {
			AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
			albumAttributeValue.setAlbumId(albumInfo.getId());
			albumAttributeValue.setAttributeId(albumAttributeValueVo.getAttributeId());
			albumAttributeValue.setValueId(albumAttributeValueVo.getValueId());
			albumAttributeValueMapper.insert(albumAttributeValue);
		}
		//保存统计星系
		saveAlbumStat(albumInfo.getId());
		if ("1".equals(albumInfo.getIsOpen())){
			//TODO
		}
	}

	private void saveAlbumStat(Long id) {
		ArrayList<String> arrayList = new ArrayList<>();
		arrayList.add(SystemConstant.ALBUM_STAT_PLAY);//播放量
		arrayList.add(SystemConstant.ALBUM_STAT_SUBSCRIBE);//订阅量
		arrayList.add(SystemConstant.ALBUM_STAT_BROWSE);//购买量
		arrayList.add(SystemConstant.ALBUM_STAT_COMMENT);//评论数
		for (String album : arrayList){
			AlbumStat albumStat = new AlbumStat();
			albumStat.setAlbumId(id);
			albumStat.setStatType(album);
			albumStatMapper.insert(albumStat);
		}
	}

	//修改专辑
	@Override
	public void pudate(Long albumId, AlbumInfo albumInfo) {
	  if (albumInfo.getPriceType().equals(SystemConstant.ALBUM_PAY_TYPE_FREE)){
		  albumInfo.setPrice(new BigDecimal(0));
		  albumInfo.setDiscount(new BigDecimal(0));
		  albumInfo.setVipDiscount(new BigDecimal(0));
	  }
	  if (!this.updateById(albumInfo)){
		  throw new GuiguException(201,"get error");
	  }
		LambdaQueryWrapper<AlbumAttributeValue> wrapper = new LambdaQueryWrapper<>();
	    wrapper.eq(AlbumAttributeValue::getAlbumId,albumId);
		albumAttributeValueMapper.delete(wrapper);

		albumInfo.getAlbumAttributeValueVoList().forEach(vo->{
			vo.setAlbumId(albumId);
			albumAttributeValueMapper.insert(vo);
		});
		if ("1".equals(albumInfo.getIsOpen())){

		}else {

		}

	}

	//分页查询
	@Override
	public List<AlbumListVo> findUserAlbumPage(IPage<AlbumListVo> page, AlbumInfoQuery albumInfoQuery) {

		return albumInfoMapper.findUserAlbumPage(page,albumInfoQuery);
	}

	@Override
	public AlbumInfo getAlbumInfo(Long albumId) {
		AlbumInfo albumInfo = albumInfoMapper.selectById(albumId);
		if (albumInfo == null){
			throw new GuiguException(201,"用户不存在");
		}
		LambdaQueryWrapper<AlbumAttributeValue> wrapper = new LambdaQueryWrapper<>();
		wrapper.eq(AlbumAttributeValue::getAlbumId,albumId);
		List<AlbumAttributeValue> albumAttributeValues = albumAttributeValueMapper.selectList(wrapper);
		albumInfo.setAlbumAttributeValueVoList(albumAttributeValues);
		return albumInfo;
	}
	@Transactional
	@Override
	public void removeAlbumInfo(Long albumId) {
		removeById(albumId);
		LambdaQueryWrapper<AlbumAttributeValue>wrapper = new LambdaQueryWrapper<>();
		wrapper.eq(AlbumAttributeValue::getAlbumId,albumId);
		albumAttributeValueMapper.delete(wrapper);
		LambdaQueryWrapper<AlbumStat>albumStatLambdaQueryWrapper = new LambdaQueryWrapper<>();
		albumStatLambdaQueryWrapper.eq(AlbumStat::getAlbumId,albumId);
		albumStatMapper.delete(albumStatLambdaQueryWrapper);
		//下架elsch
	}

	@Override
	public List<AlbumInfo> findUserAllAlbumList(Long userId) {
		LambdaQueryWrapper<AlbumInfo>wrapper = new LambdaQueryWrapper<>();
		wrapper.eq(AlbumInfo::getUserId,userId);
		List<AlbumInfo> albumInfos = albumInfoMapper.selectList(wrapper);
		return albumInfos;
	}

	@Override
	public AlbumInfo getAlbumInforbc(Long albumId) {
		return this.getAlbumInfo(albumId);
	}

	@Override
	public AlbumStatVo getAlbumInfoStartByIdrpc(Long albumId) {
		AlbumStatVo albumInfoStartByIdrpc = albumStatMapper.getAlbumInfoStartByIdrpc(albumId);
		return albumInfoStartByIdrpc;
	}
}
